/**

 其核心思想是：在子级构造函数中调用父级构造函数

 重点：用.call()和.apply()将父类构造函数引入子类函数（在子类函数中做了父类函数的自执行（复制））
 借父类的构造函数来增强子类实例，等于是把父类的实例属性复制了一份给子类实例装上了（完全没有用到原型）
 特点：
 1、只继承了父类构造函数的属性，没有继承父类原型的属性。
 2、解决了原型链继承缺点1、2、3。
 3、可以继承多个构造函数属性（call多个）。
 4、在子实例中可向父实例传参。

 缺点：
 1、只能继承父类构造函数的属性。
 2、无法实现构造函数的复用。（每次用每次都要重新调用）
 3、每个新实例都有父类构造函数的副本，臃肿。
 */

function Parent(name,age){
    this.name = name
    this.age = age
    this.arr = [1,2]
}
Parent.prototype.prop = 'Person-prop'


function Child(name,age){
    //call的第一个函数是this指向的对象,即构造函数的实例对象
    Parent.call(this,name,age)
    /*上面代码等同于下面这段代码：
    (function() {
     this.arr = [1,2,3]
    }).call(this)
    */
}

// 参数多的时候可以这样
function Child2(phone,...args){
    Parent.call(this,...args)
    //或者
    // Parent.apply(this,args)
    this.phone = phone
}




var child1 = new Child("王昭君")
console.log(child1.name)
console.log(child1.arr) //1,2
console.log(child1.prop+'没有继承父类原型的属性') // undefined 没有继承父类原型的属性

console.log()
console.log('-----------------------------------')
var child2 = new Child("安琪拉")
console.log(child2.name) // 1,2
console.log(child2.arr) //1,2
console.log(child2.prop+'没有继承父类原型的属性') // undefined 没有继承父类原型的属性

child2.arr.push(3)
console.log(child2.arr) //1,2,3,
console.log(child1.arr) //1,2

console.log()
console.log('-------------new Child2-----')
const child3 = new Child2('137...','安琪拉',20)
console.log(child3.phone) // 137...
console.log(child3.name) // 安琪拉
console.log(child3.age) // 20


